.TITLE TTCIS .IDENT /05.04/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; All rights reserved. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 23-JAN-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHIN ; ; MODIFICATIONS: ; ; DD158 12-OCT-82 DALE R. DONCHIN ; DISALLOW INPUT PROCESSING CONCURRENT WITH FORK PROCESSING ; ; S. C. ADAMS 24-OCT-83 5.01 ; SA135 -- REFERENCE U.TFRQ AS A WORD ; ; S. C. ADAMS 18-JUN-84 5.02 ; SA251 -- FIX SIMULATED ^R ; ; S. C. ADAMS 1-MAR-85 5.03 ; SA367 -- ADD TTSET1 ENTRY POINT FOR LAT ; ; D. Carroll 15-Feb-1993 05.04 ; DC127 -- Insure we are at device priority when ; aquiring the UCB fork queue lock on mP systems ; ;+ ; CONTROLLER INDEPENDENT ROUTINES TO SET UP FOR INTERRUPT PROCESSING ; AND TO QUEUE A FORK REQUEST. ;- ; ; .MCALL UCBDF$,SCBDF$ UCBDF$ ,,TTDEF SCBDF$ .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ .ENDC ;R$$MPL .PSECT MAP5 ; ; ;+ ; TTSET - COMMON INTERRUPT SET UP ROUTINE. ; ; INPUT: ; R2 SAVED BY CALL (JSR R2). ; POINTS TO POINTER TO CTB POINTER. (RSX-11M+) ; POINTS TO CONTROLLER TYPE. (RSX-11M) ; R4 SAVED BY $INTSV. ; CONTAINS CONTROLLER NUMBER * 2. ; R5 SAVED BY $INTSV. ; ; OUTPUT: ; R2 FREE TO USE ; R3 CSR ADDRESS ; R4 KRB ADDRESS ; R5 FREE TO USE ; ; CALLS CALLER BACK AS COROUTINE WITH ALL OF DRIVER MAPPED. ; CALLER EXECUTES "RETURN" BACK TO THIS ROUTINE TO RESTORE ; REGISTERS, QUEUE A FORK REQUEST IF NECESSARY AND DISMISS ; THE INTERRUPT. ;- ; ; .ENABL LSB ; TTSET:: MOV R3,-(SP) ;;;SAVE R3 MOV KISAR6,-(SP) ;;;SAVE KERNEL APR 6 .IF DF T$$COM MOV KINAR6,-(SP) ;;;SAVE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM .IF DF R$$MPL ADD @(R2)+,R4 ;;;GET POINTER TO KRB POINTER MOV @R4,R4 ;;;GET KRB ADDRESS MOV @R4,R3 ;;;GET CSR ADDRESS CALL MAPD ;;;MAP DATA AREA .IFF CALL MAPD ;;;MAP DATA AREA ADD (R2)+,R4 ;;;CALCULATE POINTER TO UCB TABLE POINTER MOV (R4),R4 ;;;GET ADDRESS OF UCB/CSR TABLE MOV (R4)+,R3 ;;;GET CSR AND POINT TO UCB TABLE .ENDC ;R$$MPL CALL @R2 ;;;CALL CALLER .IF DF T$$COM MOV (SP)+,KINAR6 ;;;RESTORE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM MOV (SP)+,KISAR6 ;;;RESTORE KERNEL APR 6 MOV (SP)+,R3 ;;;RESTORE R2, R3 MOV (SP)+,R2 ;;; TTSET1:: .IF DF M$$PRO MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEAD TST (R4)+ ;;;ANYTHING IN UCB QUEUE? BNE 10$ ;;;Y - QUEUE FORK BLOCK AND RETURN RETURN ;;;N - RETURN 10$: CALLR 100$ ;;;QUEUE FORK BLOCK .IFF TST $TTUQ ;;;ANYTHING IN UCB QUEUE? BEQ 20$ ;;;N - RETURN MOV #$TTFB+2,R4 ;;;POINT TO PC IN FORK BLOCK TST (R4)+ ;;;FORK BLOCK ALREADY IN QUEUE? BNE 20$ ;;;Y - RETURN CALL $FORK0 ;;;QUEUE FORK BLOCK .IFTF ; ; COME HERE AT SYSTEM STATE, PRIORITY 0 ; FP000:: CALL MAPD ;MAP DATA AREA CALL LOCKI ;LOCK OUT INTERRUPTS CALL 30$ ;;;PROCESS ALL UCBS IN UCB QUEUE ; ; COME BACK HERE WITH INTERRUPTS LOCKED OUT, UCB QUEUE EMPTY AND LOCKED. ; CLEAR FORK PC TO SHOW FORK BLOCK NOT IN QUEUE, UNLOCK UCB QUEUE AND RETURN. ; .IFT CLR 6(R4) ;;;CLEAR FORK PC JMP 130$ ;;;GO AND UNLOCK UCB QUEUE .IFF CLR 4(R4) ;;;CLEAR FORK PC .IFTF 20$: RETURN ;;;RETURN 30$: ;;;REFERENCE LABEL .IFT MTPS #TTPRI ;;; Insure we are at device priority MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEAD LOCK$ -LK.SPN(R4),SPIN ;;;LOCK UCB QUEUE .IFF MOV #$TTUQ,R4 ;;;POINT TO UCB QUEUE HEAD .IFTF MOV (R4)+,R5 ;;;GET FIRST UCB IN QUEUE BEQ 20$ ;;;NONE - RETURN MOV @R5,-(R4) ;;;DEQUEUE UCB BNE 40$ ;;;NOT LAST - JUMP MOV R4,2(R4) ;;;LAST UCB DEQUEUED - UPDATE PTR TO LAST 40$: INC @R5 ;;;SHOW UCB NOT IN QUEUE ANY MORE .IFT ULOCK$ -LK.SPN(R4),SPIN ;;;UNLOCK UCB QUEUE BIS #S1.DSI,U.TSTA-U.TFLK(R5) ;;;DISABLE INPUT PROC. DURING FORK .ENDC CALL 60$ ;;;PROCESS ALL FORK REQUEST BITS ;;;FOR THIS UCB BR 30$ ;;;TRY TO DEQUEUE ANOTHER UCB ; ; ;+ ; SETDSI - DISABLE INPUT PROCESSING. ; ; SOME SYSTEM STATE ROUTINES WHICH ARE NOT CALLED FROM THE DRIVER ; FORK DISPATCHER MAY DISABLE INPUT CHARACTER PROCESSING BY CALLING ; THIS ROUTINE. THE CALLER IS CALLED BACK AS A COROUTINE. ; ON RETURN HERE, ALL FORK REQUESTS FOR THE UCB ARE PROCESSED. ; AFTER THAT, INPUT PROCESSING IS ENABLED AND AN ATTEMPT IS MADE TO ; RETRIEVE CHARACTERS FROM THE TYPE-AHEAD BUFFER. ;- ; ; SETDSI::BIS #S1.DSI,@R5 ;DISABLE INPUT PROCESSING CALL @(SP)+ ;CALL CALLER CALL LOCKI ;LOCK OUT INTERRUPTS ; ; ; FIND ALL BITS THAT ARE SET IN THE FORK LEVEL REQUEST BYTE. ; FOR EACH BIT FOUND, CLEAR IT AND CALL THE CORRESPONDING ; FORK LEVEL ROUTINE. ; 50$: ADD #U.TFLK-U.TSTA,R5 ;;;POINT TO U.TFLK ASSUME U.TFRQ, 60$: TST -(R5) ;;;ANY BITS SET IN REQUEST WORD? BEQ 80$ ;;;N - JUMP MTPS #0 ;;;Y - ALLOW INTERRUPTS MOV #FRKTB-2,R2 ;GET START OF TABLE WITH POINTERS ;TO FORK LEVEL ROUTINES CLR R3 ;INITIALIZE BITMASK SEC ;MAKE SURE WE SHIFT IN A ONE 70$: ROL R3 ;SHIFT MASK LEFT TST (R2)+ ;UPDATE TABLE POINTER BIT R3,@R5 ;THIS BIT SET? BEQ 70$ ;N - LOOP (WITH CC-C = 0) BIC R3,@R5 ;Y - CLEAR IT .IF DF T$$SPL ADD #U.TSTA-U.TFRQ,R5 ;POINT TO U.TSTA MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL ASSUME U.TSTA, ADD #U.TUX-U.TFRQ,R5 ;POINT TO U.TUX MOV (R5)+,R4 ;GET UCBX IN R4 .IFTF ;T$$SPL CALL @(R2)+ ;CALL ROUTINE WITH: ; R4 = POINTER TO UCBX ; R5 = POINTER TO U.TSTA MTPS #TTPRI ;LOCK OUT INTERRUPTS BR 50$ ;;;GET NEXT FORK REQUEST BIT ; ; NO MORE PROCESSING AT ZERO PRIORITY. ENABLE PROCESSING OF INPUT ; CHARACTERS AND SEE WHAT IS WAITING FOR US IN THE TYPE-AHEAD BUFFER. ; 80$: ADD #U.TSTA-U.TFRQ,R5 ;;;POINT TO U.TSTA BIC #S1.DSI,@R5 ;;;ENABLE PROCESSING OF INPUT CHARACTERS .IF DF T$$SER SERPRO:: ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IFT ;T$$SPL MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAKE SURE UCBX IS MAPPED .ENDC ;T$$SPL CALL NXTIC ;;;PROCESS CHARACTERS FROM TYPE-AHEAD BUFFER TST U.TFRQ-U.TSTA(R5) ;;;ANY FORK REQUESTS NOW PENDING? BEQ 20$ ;;;N - RETURN BIS #S1.DSI,@R5 ;;;DISABLE INPUT PROCESSING BR 50$ ;;;PROCESS ANY PENDING FORK REQUESTS ; ; ; POST-FORK PROCESSING. PICK UP CHARACTER FROM U.TECB AND PROCESS IT. ; FPPFP:: MOV #NXTIC,@SP ;MODIFY RETURN ADDRESS MTPS #TTPRI ;LOCK OUT INTERRUPTS .IF DF T$$SPL MOVB U.TECO-U.TSTA(R5),R2 ;;;GET CHARACTER TO PROCESS .IFF ;T$$SPL MOVB U.TECB(R4),R2 ;;;GET CHARACTER TO PROCESS .ENDC ;T$$SPL BIC #S1.DSI,@R5 ;;;ENABLE INPUT PROCESSING .IF DF T$$MOD BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ;;;LINE DISABLED OR WAITING FOR CARRIER? BNE 20$ ;;;Y - JUMP .ENDC ;T$$MOD CALLR ICH2A ;;;PROCESS CHARACTER ; ; .IF DF M$$PRO ;+ ; SWCPU - SWITCH TO CORRECT CPU. ; ; INPUT: ; R3 BITMASK TO SET IN FORK REQUEST BYTE ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; IF ALREADY EXECUTING ON THE CORRECT CPU (THE ONE THAT OWNS ; THE UNIBUS WHERE THE CONTROLLER SITS), IMMEDIATE RETURN ; TO CALLER. ; ; ELSE, FORK REQUEST BIT SET IN UCB. UCB ADDED TO END OF ; TARGET CPU'S UCB QUEUE, UNLESS IT IS ALREADY QUEUED. ; TARGET CPU'S FORK BLOCK QUEUED TO FORK QUEUE, UNLESS IT ; IS ALREADY QUEUED. RETURN TO CALLER'S CALLER. ; ; REGISTERS ALTERED: R4 ;- ; ; SWCPU:: MOV U.SCB-U.TSTA(R5),R4 ;GET SCB MOV S.KRB(R4),R4 ;GET KRB BIT K.URM(R4),@$CPURM ;ALREADY ON THE RIGHT CPU? BNE 140$ ;Y - RETURN MOV K.URM(R4),@SP ;N - SAVE URM AND POP RETURN ADDRESS - WANT ;TO RETURN TO CALLER'S CALLER MOV #$URMTB,R4 ;GET START OF URM TABLE 90$: BIT @SP,(R4)+ ;IS THIS THE CORRECT CPU? BEQ 90$ ;N - LOOP TST (SP)+ ;CLEAN STACK MOV $TTUQT-$URMTB-2(R4),R4 ;GET POINTER TO POINTER TO LAST ;UCB IN TARGET CPU'S UCB QUEUE CALL 110$ ;PLACE FORK REQUEST (NO NEED TO RAISE PRIORITY, ;WE ARE ON THE WRONG CPU ANYWAY...) 100$: LOCK$ -LK.SPN-2(R4),SPIN ;LOCK UCB QUEUE TST 6(R4) ;FORK BLOCK ALREADY QUEUED? BNE 130$ ;Y - JUMP ADD #6,R4 ;N - POINT TO FORK PC MOV #FP000,@R4 ;SET FORK PC CLR -(R4) ;CLEAR LINK WORD CALL $QFORK ;QUEUE FORK BLOCK CMP -(R4),-(R4) ;BACK UP R4 BR 130$ ;UNLOCK FORK BLOCK AND RETURN .IFTF ; ; ;+ ; FORK - SET FORK LEVEL REQUEST AND ADD UCB TO UCB QUEUE. ; ; INPUT: ; R3 BITMASK TO SET IN FORK REQUEST BYTE ; R5 POINTER TO U.TSTA ; ; OUTPUT: ; REQUEST BIT SET IN UCB. UCB ADDED TO END OF UCB QUEUE, ; UNLESS IT WAS ALREADY QUEUED. ; ; REGISTERS ALTERED: R4 ;- ; ; FORK:: .IFT MOV $TTUQP,R4 ;;;POINT TO UCB QUEUE HEAD TST (R4)+ ;;;POINT TO POINTER TO LAST IN QUEUE 110$: LOCK$ -LK.SPN-2(R4),SPIN ;;;LOCK UCB QUEUE .IFF MOV #$TTUQ+2,R4 ;;;POINT TO POINTER TO LAST IN QUEUE .IFTF BIS #S1.DSI,@R5 ;;;FORCE INPUT TO TABUF ;;;PREVENT RETRIEVAL FROM TABUF ADD #U.TFRQ-U.TSTA,R5 ;;;POINT TO U.TFRQ BIS R3,(R5)+ ;;;SET REQUEST BIT (U.TFRQ) ASSUME U.TFLK, BIT #1,@R5 ;;;UCB ALREADY QUEUED? BEQ 120$ ;;;Y - JUMP MOV R5,@(R4)+ ;;;N - QUEUE IT MOV R5,-(R4) ;;;SET NEW LAST CLR @R5 ;;;CLEAR LINK WORD 120$: ADD #U.TSTA-U.TFLK,R5 ;;;RESTORE R5 .IFT 130$: ULOCK$ -LK.SPN-2(R4),SPIN ;;;UNLOCK UCB QUEUE .ENDC 140$: RETURN ;;; .DSABL LSB .END